import generatorWektorow.GeneratorWektorow;
import generatorWektorow.ParserWektorow;

import java.io.IOException;
import java.util.Date;
import java.util.List;

import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;

import typydanych.Wektor;
import KNN.KNN;

public class Starter {

	private static Logger LOG = Logger.getLogger(Starter.class);
	public static boolean krzyweZamkniete = true;
	public static boolean luki = true;
	public static boolean ciezkoscSrodka = true;
	public static boolean gornaStrefa = true;
	public static int liczbaSasiadow = 6;
	public static String obrazyUczace = "train-images.idx3-ubyte";
	public static String etykietyUczace = "train-labels.idx1-ubyte";
	public static String obrazyTestujace = "t10k-images.idx3-ubyte";
	public static String etykietyTestujace = "t10k-labels.idx1-ubyte";
	public static String wektoryUczace = "wektoryUczace.knn";
	public static String wektoryTestujace = "wektoryTestujace.knn";

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		LOG.addAppender(new ConsoleAppender(new PatternLayout()));
		try {
			long czasStartu = new Date().getTime();
			if (args.length > 0) {
				
				GeneratorWektorow generatorUczacy = wczytajZbior(obrazyUczace, etykietyUczace);
				LOG.info("wczytano zbior uczacy");
				zapiszWektory(wektoryTestujace, generatorUczacy.getListaWektorow());
				LOG.info("zapisano zbior uczacy");
				GeneratorWektorow generatorTestujacy = wczytajZbior(obrazyTestujace, etykietyTestujace);
				LOG.info("wczytano zbior testujacy");
				zapiszWektory(wektoryUczace, generatorTestujacy.getListaWektorow());
				LOG.info("zapisano zbior testujacy");
			} else {
				List<Wektor> listaWektorowUczacych = wczytajWektory(wektoryUczace);
				LOG.info("wczytano wektory uczace");
				List<Wektor> listaWektorowTestujacych = wczytajWektory(wektoryTestujace);
				LOG.info("wczytano wektory testujace");
				double skutecznoscKlasyfikacji = klasyfikuj(listaWektorowUczacych, listaWektorowTestujacych);
				LOG.info("skutecznosc klasyfikacji = "+skutecznoscKlasyfikacji);
			}
			long czasZakonczenia = new Date().getTime();
			LOG.info("Czas trwania operacji [ms]: "+(czasZakonczenia - czasStartu));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	// public static void main(String[] args) {
	// String plik = "D:\\Downloady\\KSR\\t10k-images.idx3-ubyte";
	// try {
	// int index = 9;
	// ArrayList<Obrazek> obrazki = WczytywanieObrazkow.wczytajObrazki(plik, index);
	//
	// System.out.println(obrazki.get(index));
	// System.out.println("\n\n\n");
	// ZnajdowanieKrzywychZamknietych zkz = new ZnajdowanieKrzywychZamknietych();
	// ZnajdowanieKrzywychZamknietych.LOG.addAppender(new ConsoleAppender(new PatternLayout()));
	// zkz.znajdz(obrazki.get(index));
	// WazenieCiezkosciSrodkaCyfry wcsc = new WazenieCiezkosciSrodkaCyfry();
	// // WazenieCiezkosciSrodkaCyfry.LOG.addAppender(new ConsoleAppender(new PatternLayout()));
	// // wcsc.zwazCiezkoscSrodka(obrazki.get(index));
	// // System.out.println(obrazki.size()+"\r\n"+obrazki.get(0)+"\r\n"+obrazki.get(100));
	// } catch (FileNotFoundException e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// } catch (IOException e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// }
	//
	// }

	public static GeneratorWektorow wczytajZbior(String sciezkaObrazkow, String sciezkaEtykiet) throws IOException {
		GeneratorWektorow wektoryUczace = new GeneratorWektorow();
		wektoryUczace.generujWektory(sciezkaObrazkow, sciezkaEtykiet, krzyweZamkniete, luki, ciezkoscSrodka, gornaStrefa);
		return wektoryUczace;
	}

	public static void zapiszWektory(String sciezka, List<Wektor> listaWektorow) throws IOException {
		ParserWektorow parser = new ParserWektorow();
		parser.zapiszWektory(sciezka, listaWektorow);
	}

	public static List<Wektor> wczytajWektory(String sciezka) throws IOException {
		ParserWektorow parser = new ParserWektorow();
		return parser.wczytajWektory(sciezka);
	}

	/**
	 * 
	 * @param wektoryUczace
	 * @param wektoryTestujace
	 * @return procentowa poprawnosc klasyfikacji
	 * @throws Exception
	 */
	public static double klasyfikuj(List<Wektor> wektoryUczace, List<Wektor> wektoryTestujace) throws Exception {
		KNN knn = new KNN();
		knn.setLiczbaSasiadow(liczbaSasiadow);
		knn.setZbiorUczacy(wektoryUczace);
		knn.setZbiorTestowy(wektoryTestujace);
		knn.klasyfikuj();
		return knn.getSkutecznoscKlasyfikacji();
	}

}
